from ..models.admin import Admin
from ..extensions import db
from ..utils.response import success, error, pagination
from ..utils.security import generate_password_hash, check_password

def create_admin(data):
    """创建管理员"""
    # 验证必填字段
    if not data.get('name'):
        return error('姓名不能为空', 400)
    if not data.get('phone'):
        return error('手机号不能为空', 400)
    if not data.get('password'):
        return error('密码不能为空', 400)
    
    
    # 验证性别格式
    gender = data.get('gender')
    if gender and gender not in [1, 2]:
        return error('性别格式不正确，应为1或2', 400)
    
    # 验证手机号唯一性
    phone = data.get('phone')
    if phone:
        existing_admin = Admin.query.filter_by(phone=phone).first()
        if existing_admin:
            return error('手机号已存在', 400)
    
    # 验证年龄
    age = data.get('age')
    if age is not None and (age < 0 or age > 150):
        return error('年龄必须在0-150之间', 400)
    
    # 创建管理员
    admin = Admin(
        name=data['name'],
        email=data['email'],
        gender=gender,
        age=age,
        phone=phone,
        password=generate_password_hash(data['password']),
        is_enabled=data.get('is_enabled', True)
    )
    
    try:
        db.session.add(admin)
        db.session.commit()
        return success('创建成功', admin.to_dict())
    except Exception as e:
        db.session.rollback()
        return error('创建失败', 500)

def get_admins(data):
    """获取管理员列表，支持按姓名、邮箱、启用状态筛选，支持分页"""
    query = Admin.query
    
    # 按姓名筛选
    if data.get('name'):
        query = query.filter(Admin.name.like(f"%{data['name']}%"))
    
    # 按邮箱筛选
    if data.get('email'):
        query = query.filter(Admin.email.like(f"%{data['email']}%"))
    
    # 按手机号筛选
    if data.get('phone'):
        query = query.filter(Admin.phone.like(f"%{data['phone']}%"))
    
    # 按启用状态筛选
    if 'is_enabled' in data:
        query = query.filter_by(is_enabled=data['is_enabled'])
    
    # 计算总数
    total = query.count()
    
    # 按创建时间倒序排序
    query = query.order_by(Admin.created_at.desc())
    
    # 获取分页参数
    page = int(data.get('page', 1))
    page_size = int(data.get('page_size', 10))
    
    # 处理无效的分页参数
    if page < 1:
        page = 1
    if page_size < 1:
        page_size = 10
    elif page_size > 100:
        page_size = 100  # 限制最大每页记录数
    
    # 计算偏移量
    offset = (page - 1) * page_size
    
    # 获取分页数据
    admins = query.offset(offset).limit(page_size).all()
    
    # 返回分页数据
    return pagination(
        items=[admin.to_dict() for admin in admins],
        total=total,
        msg='获取成功',
        code=200
    )

def update_admin(data):
    """更新管理员信息"""
    # 获取管理员ID
    admin_id = data.get('id')
    if not admin_id:
        return error('管理员ID不能为空', 400)
    
    # 查找管理员
    admin = Admin.query.get(admin_id)
    if not admin:
        return error('管理员不存在', 404)
    
    # 更新姓名
    if 'name' in data:
        if not data['name']:
            return error('姓名不能为空', 400)
        admin.name = data['name']
    
    # 更新邮箱
    if 'email' in data:
        if not data['email']:
            return error('邮箱不能为空', 400)
        # 检查邮箱唯一性
        existing_admin = Admin.query.filter_by(email=data['email']).first()
        if existing_admin and existing_admin.id != admin_id:
            return error('邮箱已存在', 400)
        admin.email = data['email']
    
    # 更新性别
    if 'gender' in data:
        if int(data['gender']) not in [1, 2]:
            return error('性别格式不正确，应为1或2', 400)
        admin.gender = int(data['gender'])
    
    # 更新年龄
    if 'age' in data:
        if data['age'] is not None and (data['age'] < 0 or data['age'] > 150):
            return error('年龄必须在0-150之间', 400)
        admin.age = data['age']
    
    if 'password' in data:
        if not data['password']:
            return error('密码不能为空', 400)
        admin.password = generate_password_hash(data['password'])
    
    # 更新启用状态
    if 'is_enabled' in data:
        admin.is_enabled = data['is_enabled']
    
    try:
        db.session.commit()
        return success('更新成功', admin.to_dict())
    except Exception as e:
        db.session.rollback()
        return error('更新失败', 500)

def delete_admin(data):
    """删除管理员"""
    # 获取管理员ID
    admin_id = data.get('id')
    if not admin_id:
        return error('管理员ID不能为空', 400)
    
    # 查找管理员
    admin = Admin.query.get(admin_id)
    if not admin:
        return error('管理员不存在', 404)
    
    try:
        db.session.delete(admin)
        db.session.commit()
        return success('删除成功')
    except Exception as e:
        db.session.rollback()
        return error('删除失败', 500)

# 管理员登录
def login_admin(data):
    """管理员登录"""
    # 获取手机号和密码
    phone = data.get('username')
    password = data.get('password')
    
    # 验证手机号和密码是否为空
    if not phone or not password:
        return error('手机号和密码不能为空', 400)
    
    # 查找管理员
    admin = Admin.query.filter_by(phone=phone).first()
    if not admin:
        return error('管理员不存在', 404)
    
    # 验证密码
    if not check_password(admin.password, password):
        return error('密码错误', 400)
    
    # 登录成功，返回管理员信息
    return success('登录成功', admin.to_dict())
